package com.brain.core.view.util;

import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.*;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.*;
import com.brain.core.view.mbean.*;
import java.math.BigDecimal;
import java.math.RoundingMode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.springframework.stereotype.Controller;

@Controller("applicationHelper")
public class ApplicationHelper {

    private static Logger logger = Logger.getLogger(ApplicationHelper.class);

    public static CatalogoParametroDto obtenerCatalogoPorId(Long id) {
        CatalogoParametroManager manager = (CatalogoParametroManager) WebServletContextListener.getApplicationContext().getBean("catalogoParametroManager");
        try {
            return manager.obtenerPorId(id);
        } catch (DAOException ex) {
            logger.error(ex);
            return null;
        }
    }

    public static List<ParametroDto> obtenerParametrosPorCatalogo(Long catalogo) {
        ParametroManager manager = (ParametroManager) WebServletContextListener.getApplicationContext().getBean("parametroManager");
        try {
            return manager.obtenerParametrosActivosPorCatalogo(catalogo);
        } catch (DAOException ex) {
            logger.error(ex);
            return null;
        }
    }

    public static SocioNegocioDto obtenerSocioNegocioPorId(Long id) {
        SocioNegocioManager manager = (SocioNegocioManager) WebServletContextListener.getApplicationContext().getBean("socioNegocioManager");
        try {
            return manager.obtenerPorId(id);
        } catch (DAOException ex) {
            logger.error(ex);
            return null;
        }
    }

    public static OrganizacionDto obtenerOrganizacionPorId(Long id) {
        OrganizacionManager manager = (OrganizacionManager) WebServletContextListener.getApplicationContext().getBean("organizacionManager");
        try {
            return manager.obtenerPorId(id);
        } catch (DAOException ex) {
            logger.error(ex);
            return null;
        }
    }

    public static ParametroDto obtenerParametroPorId(Long id) {

        ParametroManager manager = (ParametroManager) WebServletContextListener.getApplicationContext().getBean("parametroManager");
        try {
            return manager.obtenerPorId(id);
        } catch (DAOException ex) {
            logger.error(ex);
            return null;
        }
    }

    /**
     *
     * @param forma 0 todos, 1 clientes, 2 proveedores 3 representadas
     * @return
     */
    public static List<SocioNegocioDto> listaSociosNegocioActivos(int forma) {
        SocioNegocioManager manager = (SocioNegocioManager) WebServletContextListener.getApplicationContext().getBean("socioNegocioManager");
        try {
            Map<String, Object> mapFiltro = new HashMap<String, Object>();
            mapFiltro.put("estadoDto.id", ConstantesCore.Parametro.SOCIO_NEGOCIO_ESTADO_ACTIVO);
            if (forma == 1) {
                mapFiltro.put("cliente", Boolean.TRUE);
            }
            if (forma == 2) {
                mapFiltro.put("proveedor", Boolean.TRUE);
            }
            if (forma == 3) {
                mapFiltro.put("representada", Boolean.TRUE);
            }
            Map<String, String> mapOrden = new HashMap<String, String>();
            mapOrden.put("descripcion", "asc");
            return manager.obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error(ex);
            return new ArrayList<SocioNegocioDto>();
        }
    }

    /**
     *
     * @param forma 0 todos, 1 clientes, 2 proveedores 3 representadas
     * @return
     */
    public static List<SocioNegocioDto> listaSociosNegocioActivos(int forma, String descripcion) {
        SocioNegocioManager manager = (SocioNegocioManager) WebServletContextListener.getApplicationContext().getBean("socioNegocioManager");
        try {
            /*
             * Map<String, Object> mapFiltro = new HashMap<String, Object>();
             * mapFiltro.put("estadoDto.id",
             * ConstantesCore.Parametro.SOCIO_NEGOCIO_ESTADO_ACTIVO); if
             * (descripcion != null) { mapFiltro.put("descripcion",
             * descripcion.toUpperCase()); }
             *
             * if (forma == 1) { mapFiltro.put("cliente", 1L); } if (forma == 2)
             * { mapFiltro.put("proveedor", 1L); } if (forma == 3) {
             * mapFiltro.put("representada", 1L); } Map<String, String> mapOrden
             * = new HashMap<String, String>(); mapOrden.put("descripcion",
             * "asc"); return manager.obtenerConFiltroConOrden(mapFiltro, mapOrden);
             */
            return manager.obtenerSocioNegocioPorQueryPropietario(forma, descripcion);
        } catch (DAOException ex) {
            logger.error(ex);
            return new ArrayList<SocioNegocioDto>();
        }
    }

    

    public static void cargarLogger() {
        Logger logger = null;
        try {
            RecursosManager recursosManager = (RecursosManager) WebServletContextListener.getApplicationContext().getBean("recursosManager");
            String rutaLog = "";
            {
                ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_LOG);
                if (p.getValorCadena() != null) {
                    rutaLog = p.getValorCadena();
                } else {
                    rutaLog = "D:\\log\\WebBrainCore";
                }
            }
            System.out.print("= = = = = = = = = =  INICIANDO CONTEXTO WEB BRAIN = = = = = = = = = =  ");
            Properties prop = new Properties();
            prop.setProperty("log4j.rootCategory", "INFO, LOGFILE, CONSOLE");
            prop.setProperty("log4j.appender.CONSOLE", "org.apache.log4j.ConsoleAppender");
            prop.setProperty("log4j.appender.CONSOLE.layout", "org.apache.log4j.PatternLayout");
            prop.setProperty("log4j.appender.CONSOLE.layout.ConversionPattern", "[%d{yyyy-MM-dd HH:mm:ss}] - [%5p] (%C{1}.%M:%L) - %m%n");
            prop.setProperty("log4j.appender.LOGFILE", "org.apache.log4j.DailyRollingFileAppender");
            prop.setProperty("log4j.appender.LOGFILE.file", rutaLog);
            prop.setProperty("log4j.appender.LOGFILE.DatePattern", "'.'yyyy-MM-dd'.log'");
            prop.setProperty("log4j.appender.LOGFILE.Maxize", "2048KB");
            prop.setProperty("log4j.appender.archivo.maxize", "20MB");
            prop.setProperty("log4j.appender.archivo.maxBackupIndex", "5");
            prop.setProperty("log4j.appender.LOGFILE.append", "true");
            prop.setProperty("log4j.appender.LOGFILE.layout", "org.apache.log4j.PatternLayout");
            prop.setProperty("log4j.appender.LOGFILE.layout.ConversionPattern", "[%d{yyyy-MM-dd HH:mm:ss}] - [%5p] (%C{1}.%M:%L) - %m%n");
            //prop.setProperty("log4j.logger.org.springframework", "INFO, LOGFILE, CONSOLE");
            //prop.setProperty("log4j.logger.org.hibernate", "INFO, LOGFILE, CONSOLE");
            PropertyConfigurator.configure(prop);

            logger.info("= = = = = = = = = =  CONTEXTO SGC360 CARGADO SATISFACTORIAMENTE = = = = = = = = = =  ");
            System.out.print("= = = = = = = = = =  CONTEXTO SGC360 CARGADO SATISFACTORIAMENTE = = = = = = = = = =  ");




        } catch (Exception e) {
            BasicConfigurator.configure();
        }
    }

    public static void cargarParametrosGenerales() {
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        RecursosManager recursosManager = (RecursosManager) WebServletContextListener.getApplicationContext().getBean("recursosManager");
        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_RUTA_ARCHIVOS);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setRutaArchivos(p.getValorCadena());
            } else {
                applicationMBean.setRutaArchivos("D:\\\\archivos\\");
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_RUTA_JASPERS);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setRutaJaspers(p.getValorCadena());
            } else {
                applicationMBean.setRutaJaspers("D:\\\\jaspers\\");
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_FORMATO_MONTOS_OFERTA);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setFormatoMontoOferta(p.getValorCadena());
            } else {
                applicationMBean.setFormatoMontoOferta("#,###.0000");
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_PRECISION_DECIMAL);
            if (p != null && p.getValorEntero() != null) {
                applicationMBean.setPrecisionDecimales(p.getValorEntero().intValue());
            } else {
                applicationMBean.setPrecisionDecimales(2);
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_PRECISION_DECIMAL_OFERTA);
            if (p != null && p.getValorEntero() != null) {
                applicationMBean.setPrecisionDecimalesOferta(p.getValorEntero().intValue());
            } else {
                applicationMBean.setPrecisionDecimalesOferta(8);
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_FORMATO_MONTOS_TIPO_CAMBIO);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setFormatoMontosTipoCambio(p.getValorCadena());
            } else {
                applicationMBean.setFormatoMontosTipoCambio("#,###.0000");
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_FORMATO_MONTOS);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setFormatoMontos(p.getValorCadena());
            } else {
                applicationMBean.setFormatoMontos("#,###.00");
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_FORMATO_HORA);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setFormatoHora(p.getValorCadena());
            } else {
                applicationMBean.setFormatoHora("HH:mm:ss");
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_FORMATO_FECHA);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setFormatoFecha(p.getValorCadena());
            } else {
                applicationMBean.setFormatoFecha("dd/MM/yyyy");
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_FORMATO_FECHA_HORA_SEGUNDO);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setFormatoFechaHoraSegundos(p.getValorCadena());
            } else {
                applicationMBean.setFormatoFechaHoraSegundos("dd/MM/yyyy HH:mm:ss");
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_FORMATO_FECHA_HORA_MINUTO);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setFormatoFechaHora(p.getValorCadena());
            } else {
                applicationMBean.setFormatoFechaHora("dd/MM/yyyy HH:mm");
            }
        }

        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_EMAIL_SERVIDOR_SALIDA);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setMailServidor(p.getValorCadena());
            } else {
                applicationMBean.setMailServidor("smtp.gmail.com");
            }
        }
        
        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_EMAIL_PUERTO_SALIDA);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setMailPuerto(p.getValorCadena());
            } else {
                applicationMBean.setMailPuerto("465");
            }
        }
        
        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_EMAIL_SALIDA);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setMailFrom(p.getValorCadena());
            } else {
                applicationMBean.setMailFrom("web.brain.jbiss");
            }
        }
        
        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_EMAIL_PASSWORD);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setMailFromPwd(p.getValorCadena());
            } else {
                applicationMBean.setMailFromPwd("web.brain.jbiss");
            }
        }
        
        {
            ParametroDto p = recursosManager.obtenerParametroPorID(ConstantesCore.Parametro.PARAMETRO_GENERAL_EMAIL_NAME);
            if (p != null && p.getValorCadena() != null) {
                applicationMBean.setMailFromName(p.getValorCadena());
            } else {
                applicationMBean.setMailFromName("SISTEMA.WEB.BRAIN");
            }
        }
        
        

    }

    public static void cargarPropietarios(Long entidad, Long registro) {
        List<PropietarioDto> lista = null;
        try {

            Map<String, Object> map = new HashMap<String, Object>();
            map.put("propietarioDtoPK.entidad", entidad);
            map.put("propietarioDtoPK.registro", registro);
            Map<String, String> mapFiltro = new HashMap<String, String>();
            mapFiltro.put("propietarioDtoPK.organizacionDto.descripcion", "asc");
            PropietarioManager manager = (PropietarioManager) WebServletContextListener.getApplicationContext().getBean("propietarioManager");
            lista = manager.obtenerConFiltroConOrden(map, mapFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
            lista = null;
        }
        PropietarioMBean propietarioMBean = (PropietarioMBean) WebServletContextListener.getApplicationContext().getBean("propietarioMBean");
        propietarioMBean.setListaPropietarios(lista);
    }

    public static void cargarArchivos(Long entidad, Long registro) {
        List<ArchivoDto> lista = null;
        try {

            Map<String, Object> map = new HashMap<String, Object>();
            map.put("entidad", entidad);
            map.put("registro", registro);
            Map<String, String> mapFiltro = new HashMap<String, String>();
            mapFiltro.put("fecha", "desc");
            mapFiltro.put("nombre", "desc");
            ArchivoManager manager = (ArchivoManager) WebServletContextListener.getApplicationContext().getBean("archivoManager");
            lista = manager.obtenerConFiltroConOrden(map, mapFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
            lista = null;
        }
        ArchivoMBean mbean = (ArchivoMBean) WebServletContextListener.getApplicationContext().getBean("archivoMBean");
        mbean.setListaArchivos(lista);
    }

    public static List<OrganizacionDto> obtenerOrganizacionesPropietario(Long registro) {
        List<OrganizacionDto> listaOrganizaciones = new ArrayList<OrganizacionDto>();
        List<PropietarioDto> lista = null;
        try {

            Map<String, Object> map = new HashMap<String, Object>();
            map.put("propietarioDtoPK.entidad", ConstantesCore.Entidad.USUARIO);
            map.put("propietarioDtoPK.registro", registro);
            map.put("estado", Boolean.TRUE);
            Map<String, String> mapFiltro = new HashMap<String, String>();
            mapFiltro.put("propietarioDtoPK.organizacionDto.paisDto.prioridad", "asc");
            PropietarioManager manager = (PropietarioManager) WebServletContextListener.getApplicationContext().getBean("propietarioManager");
            lista = manager.obtenerConFiltroConOrden(map, mapFiltro);

            for (PropietarioDto p1 : lista) {
                System.out.println(p1.getPropietarioDtoPK().getOrganizacionDto().getDescripcion());
            }

            if (lista != null) {
                for (PropietarioDto p : lista) {
                    listaOrganizaciones.add(p.getPropietarioDtoPK().getOrganizacionDto());
                }
            }

        } catch (DAOException ex) {
            logger.error(ex);
            lista = null;
        }
        PropietarioMBean propietarioMBean = (PropietarioMBean) WebServletContextListener.getApplicationContext().getBean("propietarioMBean");
        propietarioMBean.setListaPropietarios(lista);

        return listaOrganizaciones;
    }

    public static Map<String, Boolean> obtenerPrivilegiosUsuario() {
        Map<String, Boolean> privilegiosOpciones = new HashMap<String, Boolean>();

        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        PermisoRolManager permisoRolManager = (PermisoRolManager) WebServletContextListener.getApplicationContext().getBean("permisoRolManager");
        
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("rolDto.id", sessionMBean.getSessionUsuarioDto().getRolDto().getId());        
        map.put("opcionSistemaDto.tipoMenu", "O");
        Map<String, String> order = new HashMap<String, String>();
        order.put("opcionSistemaDto.orden", "asc");
        order.put("opcionSistemaDto.descripcion", "asc");
        List<PermisoRolDto> listaPermisos = null;
        try {
            listaPermisos = permisoRolManager.obtenerConFiltroConOrden(map, order);
        } catch (DAOException ex) {
            logger.error(ex);
        }
        
        for (PermisoRolDto p : listaPermisos) {
            privilegiosOpciones.put(p.getOpcionSistemaDto().getId().toString(), p.getEstado());
        }


        return privilegiosOpciones;
    }

    public static void cargarBitacoraEntidad(Long entidad, Long registro) {
        List<BitacoraEntidadDto> lista = null;
        try {
            BitacoraManager manager = (BitacoraManager) WebServletContextListener.getApplicationContext().getBean("bitacoraManager");
            lista = manager.obtenerBitacorasEntidad(entidad, registro);
        } catch (DAOException ex) {
            logger.error(ex);
            lista = null;
        }
        BitacoraEntidadMBean mbean = (BitacoraEntidadMBean) WebServletContextListener.getApplicationContext().getBean("bitacoraEntidadMBean");
        mbean.setListaBitacoras(lista);
    }

    public static BigDecimal obtenerFactorConversion(Long deMoneda, Long aMoneda, Long organizacion, String tipo) {
        BigDecimal factorConversion = null;
        TipoCambioManager tcManager = (TipoCambioManager) WebServletContextListener.getApplicationContext().getBean("tipoCambioManager");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");

        TipoCambioDto tc = null;
        try {
            tc = tcManager.obtenerUltimoTipoCambio(organizacion, tipo);

            if (tc != null) {
                if (deMoneda.equals(ConstantesCore.ValoresDefecto.MONEDA_DEFECTO)) { //si deMoneda es dollar
                    if (aMoneda.equals(ConstantesCore.ValoresDefecto.MONEDA_DEFECTO)) {
                        factorConversion = BigDecimal.ONE;
                    } else {
                        for (TipoCambioDetaDto tcd : tc.getTiposCambioDetaDto()) {
                            if (tcd.getMonedaCambioDto().getId().equals(aMoneda)) {
                                factorConversion = tcd.getFactor();
                                break;
                            }
                        }
                    }
                } else if (aMoneda.equals(ConstantesCore.ValoresDefecto.MONEDA_DEFECTO)) { // si aMoneda es dollar
                    if (deMoneda.equals(ConstantesCore.ValoresDefecto.MONEDA_DEFECTO)) {
                        factorConversion = BigDecimal.ONE;
                    } else {
                        for (TipoCambioDetaDto tcd : tc.getTiposCambioDetaDto()) {
                            if (tcd.getMonedaCambioDto().getId().equals(deMoneda)) {
                                factorConversion = BigDecimal.ONE.divide(tcd.getFactor(), applicationMBean.getPrecisionDecimales(), RoundingMode.HALF_UP);
                                break;
                            }
                        }
                    }
                } else { //si ni deMoneda ni aMoneda es dollar
                    BigDecimal factorAMoneda = null;
                    BigDecimal factorDeMoneda = null;
                    for (TipoCambioDetaDto tcd : tc.getTiposCambioDetaDto()) {
                        if (tcd.getMonedaCambioDto().getId().equals(deMoneda)) {
                            factorDeMoneda = tcd.getFactor();
                        }
                        if (tcd.getMonedaCambioDto().getId().equals(aMoneda)) {
                            factorAMoneda = tcd.getFactor();
                        }
                    }
                    factorConversion = factorAMoneda.divide(factorDeMoneda, applicationMBean.getPrecisionDecimales(), RoundingMode.HALF_UP);
                }
            }

        } catch (DAOException ex) {
            logger.error(ex);
        }
        return factorConversion;
    }
}
